<?php

class ResumenController extends Zend_Controller_Action
{
    public function init()
    {
        if (X\CheckAccess::Controller()) return;

        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    //---------------------------------//
    //             PAGINAS             //
    //---------------------------------//

    public function crearAction()
    {
      
    }

    public function ajaxListarAction(){

        if (X\CheckAccess::AjaxAction($this, 'Reporte.Resumen de Movimientos')) return;

        try{

            $tipo = $this->_request->getPost('tipo');

            if($tipo == 1){
                $tipo = 'true';
            }
            else{
                $tipo = 'false';
            }

            // obtener los datos
            $rubros = $this->em->createQueryBuilder()
                    ->select         ('r.codigo')
                    ->addselect      ('r.nombreRubro')
                    ->addselect      ('r.codigoRubro')
                    ->from           ('Default_Model_Rubro', 'r')
                    ->where          ("r.egreso = $tipo")
                    ->andWhere       ('r.terminal = true')
                    ->orderBy        ('r.nombreRubro', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            // crear la respuesta en json
            echo Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($rubros),
                "rows"    => $rubros
            ));

        }

        catch(Exception $e){
            X\Msg::Failure('Error al cargar los datos.'.$e->getMessage());
        }

    }

    
    public function ajaxCrearAction()
    {
        if (X\CheckAccess::PageAction('Reporte.Resumen de Movimientos')) return;

        try{
            
            // obtener los parametros
            $editorRows = $this->_request->getPost('editorRows');
            $fechaIni   = $this->_request->getPost('filtroInicial');
            $fechaFin   = $this->_request->getPost('filtroFinal');
            $rubro      = $this->_request->getPost('nombre');
            $tipo       = $this->_request->getPost('tipoRubro');
            $total      = $this->_request->getPost('total');

            if($tipo == 1){
                $tipo = 'Egreso';
            }
            else{
                $tipo = 'Ingreso';
            }

            $rows = Zend_Json::decode($editorRows);

            // create PDF
            $pdf = new Zend_Pdf();
            // create A4 page
            $page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4_LANDSCAPE); //'842:595:'
            // define font resource
            $font = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA);
            $font2 = Zend_Pdf_Font::fontWithName(Zend_Pdf_Font::FONT_HELVETICA_BOLD);

            $page->setFont($font2, 12)
                 ->drawText('Reporte :', 150, 560)
                 ->drawText('Rubro :', 150, 540)
                 ->drawText('Tipo :', 150, 520)
                 ->drawText('Fecha inicial :', 150, 500)
                 ->drawText('Fecha final :', 150, 480);
            $page->setFont($font, 12)
                 ->drawText('Listado de movimientos por rubro', 235, 560)
                 ->drawText("$rubro", 235, 540, 'UTF-8')
                 ->drawText("$tipo", 235, 520)
                 ->drawText("$fechaIni", 235, 500)
                 ->drawText("$fechaFin", 235, 480);
                 
            $image = \Zend_Pdf_Image::imageWithPath('img/logoUCA.png');
            $page->drawImage($image, 20, 480, ($image->getPixelWidth()+20), (480+$image->getPixelHeight()));
            $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                 ->drawLine(10, 465, ($page->getWidth()-10), 465);
            $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                 ->drawLine(10, 445, ($page->getWidth()-10), 445);

            $page->setFont($font, 12)
                 ->drawText('Fecha', 165, 452)
                 ->drawText('Monto', 750, 452)
                 ->drawText('Solic. Nro.', 95, 452)
                 ->drawText('Concepto', 465, 452)
                 ->drawText('Comprob.', 20, 452)
                 ->drawText('A la orden de', 230, 452);
                 

            // add page to document
            $pdf->pages[] = $page;

            $pageNumber=1;

            //carga del detalle del log al pdf
            $i=430;
            foreach($rows as $row){
                
                //si se aproxima el fin de pagina, nueva pagina
                if($i <= 90){
                    // create A4 page
                    $page = new Zend_Pdf_Page(Zend_Pdf_Page::SIZE_A4_LANDSCAPE); //'842:595:'

                    // agregar pagina al pdf
                    $pdf->pages[] = $page;
                    $i=570;
                    $pageNumber++;
                }

                //si no es la primera pagino no utilizamos encabezado
                if($pageNumber>1 && $i==570){
                    $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                        ->drawLine(10, 570, ($page->getWidth()-10), 570);
                    $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                        ->drawLine(10, 550, ($page->getWidth()-10), 550);

                    $page->setFont($font, 12)
                        ->drawText('Fecha', 165, 555)
                        ->drawText('Monto', 750, 555)
                        //cantidad estaba antes
                        ->drawText('Solic. Nro.', 95, 555)
                        ->drawText('Concepto', 465, 555)
                        ->drawText('Comprob.', 20, 555)
                        //obs estaba antes
                        ->drawText('A la orden de', 230, 555);

                    $i=535;
                }

             //   $row['concepto'] = substr($row['concepto'], 0, 39);
             //   $row['observaciones'] = substr($row['observaciones'], 0, 39);
             
                $page->setFont($font, 10)
                  ->drawText($row['numeroComprobante'], 20, $i)
                  ->drawText($row['fechaMovimiento'],  165, $i);

                $montopos= 780-$this->getTextWidth($row['monto'],$font,10);
                $page->setFont($font, 10)
                    ->drawText(number_format($row['monto'], 0,',','.'),            $montopos, $i)
                    ->drawText($row['numeroSolicitud'],         105, $i);
                
                
                $y1=$i;
                $text = wordwrap($row['chequeOrden'], 45);
                $token = strtok($text, "\n");
                $salto1 = 0;
                while ($token != false){
                	$page->setFont($font, 10)->drawText($token,  230, $y1, 'UTF-8');
                	$token = strtok("\n"); $y1 = $y1-12;
                	$salto1++;
                }
                
                if($salto1>1){
                	$i=$y1+12*$salto1;
                }
                
                $y2=$i;               
                $text = wordwrap($row['concepto'], 45);
                $token = strtok($text, "\n");
                $salto2 = 0;
                while ($token != false){
                	$page->setFont($font, 10)->drawText($token,  465, $y2, 'UTF-8');
                	$token = strtok("\n"); $y2 = $y2-12;
                	$salto2++;
                }
                
                if($salto1>$salto2){
                	$i=$y1+12;
                }
                else{
                	$i=$y2+12;
                }
                

                $i =$i - 24;
            }
            $page->setLineColor(new \Zend_Pdf_Color_Rgb(0,0,0))
                        ->drawLine(700, $i,790, $i);
            $total = intval($total);
            $montopos= 780-$this->getTextWidth($total,$font2,10);
            $page->setFont($font2, 10)
                ->drawText(number_format($total, 0,',','.'), $montopos, $i-15);

            // Agregar numero de pagina al pie
            $pageNumber=1;
            foreach($pdf->pages as $p){
                $p->drawText($pageNumber++,  790, 40);
            }

            // Guardar el pdf
            $fileName = 'ListadoMovimientos.pdf';
            $pdf->save($fileName);

            X\Msg::Success('El reporte se ha generado con éxito.');

        }
        catch(Exception $e){
            X\Msg::Failure('Error al generar el reporte.');
        }
    }

    public function pdfAction(){

          $pdf = Zend_Pdf::load('ListadoMovimientos.pdf');

          $this->getResponse()->setHeader('Content-type', 'application/x-pdf', true);
          $this->getResponse()->setHeader('Content-disposition', "filename=ListadoMovimientos.pdf", true);
          $this->getResponse()->setBody($pdf->render());
     }

    public function ajaxFiltroAction()
    {
        if (X\CheckAccess::PageAction('Reporte.Resumen de Movimientos')) return;

        try{
            // obtener los parametros
            $filtroInicial = $this->_request->getPost("filtroInicial");
            $filtroFinal   = $this->_request->getPost("filtroFinal");
            $filtroRubro   = $this->_request->getPost("filtroRubro");

            // fijar cota de fechas y horas para el retrieve de datos
            $filtroInicial  = str_replace(        'T',         ' ', $filtroInicial);
            $filtroFinal    = str_replace('T00:00:00', ' 23:59:59', $filtroFinal  );

            // crear el where para filtrar
            $filtroFecha = ($filtroInicial && $filtroFinal? "m.fechaMovimiento >= '$filtroInicial' and m.fechaMovimiento <= '$filtroFinal'"
                         : ($filtroInicial                ? "m.fechaMovimiento >= '$filtroInicial'"
                         : ($filtroFinal                  ? "m.fechaMovimiento <= '$filtroFinal'"
                         : '')));
            $filtroRubro = ($filtroRubro!=0 ? "r.codigoRubro = '$filtroRubro'" : '');

            // obtener los datos
            $movimientos = $this->em->createQueryBuilder()
                ->select    ('m.codigoMovimiento')
                ->addselect ('m.observaciones')
                ->addselect ('m.monto')
                ->addselect ('m.cantidad')
                ->addselect ('m.concepto')
                ->addselect ('m.fechaMovimiento')
                ->addselect ('r.egreso')
                ->addSelect ('r.codigo')
                ->addSelect ('r.codigoRubro')
                ->addSelect ('r.nombreRubro')
                ->addSelect ('c.codigoComprobante')
                ->addSelect ('c.numeroComprobante')
                ->addselect ('s.numeroSolicitud')
                ->addselect ('s.chequeOrden')
                ->from      ('Default_Model_Movimiento', 'm')
                ->leftjoin  ('m.cuenta',      'cu')
                ->leftjoin  ('cu.rubro',      'r' )
                ->leftjoin  ('m.comprobante', 'c' )
                ->leftjoin  ('m.solicitud', 's' )
                ->where     ($filtroFecha)
                ->andWhere  ($filtroRubro)
                ->andWhere  ('m.solicitud IS NOT NULL')
                ->getQuery  ()
                ->execute   ();

            // crear la respuesta en json
            echo Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($movimientos),
                "rows"    => $movimientos
            ));
        }
        catch(Exception $e){
            X\Msg::Failure('Error al listar los datos.'.$e->getMessage());
        }
    }

    public function getTextWidth($text, Zend_Pdf_Resource_Font $font, $font_size)
    {
	$drawing_text = iconv('', 'UTF-16BE', $text);
	$characters    = array();
	for ($i = 0; $i < strlen($drawing_text); $i++) {
		$characters[] = (ord($drawing_text[$i++]) << 8) | ord ($drawing_text[$i]);
	}
	$glyphs        = $font->glyphNumbersForCharacters($characters);
	$widths        = $font->widthsForGlyphs($glyphs);
	$text_width   = (array_sum($widths) / $font->getUnitsPerEm()) * $font_size;
	return $text_width;
    }
}
